package qc.module.qms.service.producer;

import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.constants.QmsMQConstant;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.qms.dto.mq.QmsMqManualTaskCalcPointDataMessageDto;
import qc.module.qms.dto.mq.QmsMqManualTaskForwardPointDataMessageDto;
import qc.module.qms.dto.mq.QmsMqManualTaskProcessRawDataMessageDto;

/**
 * QMS人工长耗时任务发送至MQ生产者Producer，只管发送消息，不管消息是否成功发送至MQ
 * 根据人工长耗时任务类型确定发送消息的主题和消息对象
 *
 * @author QuCheng Tech
 * @since 2025/10/26
 */
@Service
public class QmsManualTaskProducer {
    private static final Logger logger = LoggerFactory.getLogger(QmsManualTaskProducer.class);

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 发送处理原始数据人工任务消息至MQ，发送失败不提示也不抛出异常
     *
     * @param message 处理原始数据人工任务消息
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    public String sendProcessRawDataMessage(QmsMqManualTaskProcessRawDataMessageDto message) {
        //如果消息为空或无效，不发送至MQ
        if (message != null) {
            try {
                SendResult sendResult = rocketMQTemplate.syncSend(QmsMQConstant.MQ_MANUALTASK_PROCESSRAWDATA_TOPIC, message);
                SendStatus sendStatus = sendResult.getSendStatus();
                //根据发送至消息队列的结果进行判断，如果发送成功则返回成功（后续的数据处理和保存至数据库均由对应消费者进行），如果发送失败则需要再次直接调用保存到原始数据库方法
                if (sendStatus == SendStatus.SEND_OK) {
                    logger.debug("sendProcessRawDataMessage 发送处理原始数据消息至MQ成功，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                } else {
                    //发送失败记录日志，返回发送结果状态
                    logger.error("sendProcessRawDataMessage 发送处理原始数据消息至MQ失败，发送状态[" + sendStatus.name() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                    return QCUnifyReturnValue.Warn("发送状态[" + sendStatus.name() + "]");
                }
            } catch (Exception ex) {
                logger.error("sendProcessRawDataMessage 发送处理原始数据消息至MQ异常，异常信息[" + ex.getMessage() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                return QCUnifyReturnValue.Warn("异常信息[" + ex.getMessage() + "]");
            }
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 发送计算点号数据人工任务消息至MQ，发送失败不提示也不抛出异常
     *
     * @param message 计算点号数据人工任务消息
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    public String sendCalcPointDataMessage(QmsMqManualTaskCalcPointDataMessageDto message) {
        //如果消息为空或无效，不发送至MQ
        if (message != null) {
            try {
                SendResult sendResult = rocketMQTemplate.syncSend(QmsMQConstant.MQ_MANUALTASK_CALCPOINTDATA_TOPIC, message);
                SendStatus sendStatus = sendResult.getSendStatus();
                //根据发送至消息队列的结果进行判断，如果发送成功则返回成功（后续的数据处理和保存至数据库均由对应消费者进行），如果发送失败则需要再次直接调用保存到原始数据库方法
                if (sendStatus == SendStatus.SEND_OK) {
                    logger.debug("sendCalcPointDataMessage 发送计算点号数据消息至MQ成功，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                } else {
                    //发送失败只记录日志
                    logger.error("sendCalcPointDataMessage 发送计算点号数据消息至MQ失败，发送状态[" + sendStatus.name() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                    return QCUnifyReturnValue.Warn("发送状态[" + sendStatus.name() + "]");
                }
            } catch (Exception ex) {
                logger.error("sendCalcPointDataMessage 发送计算点号数据消息至MQ异常，异常信息[" + ex.getMessage() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                return QCUnifyReturnValue.Warn("异常信息[" + ex.getMessage() + "]");
            }
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 发送转发点号数据人工任务消息至MQ，发送失败不提示也不抛出异常
     *
     * @param message 转发点号数据人工任务消息
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2025/10/29
     */
    public String sendForwardPointDataMessage(QmsMqManualTaskForwardPointDataMessageDto message) {
        //如果消息为空或无效，不发送至MQ
        if (message != null) {
            try {
                SendResult sendResult = rocketMQTemplate.syncSend(QmsMQConstant.MQ_MANUALTASK_FORWARDPOINTDATA_TOPIC, message);
                SendStatus sendStatus = sendResult.getSendStatus();
                //根据发送至消息队列的结果进行判断，如果发送成功则返回成功（后续的数据处理和保存至数据库均由对应消费者进行），如果发送失败则需要再次直接调用保存到原始数据库方法
                if (sendStatus == SendStatus.SEND_OK) {
                    logger.debug("sendForwardPointDataMessage 发送转发点号数据消息至MQ成功，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                } else {
                    //发送失败只记录日志
                    logger.error("sendForwardPointDataMessage 发送转发点号数据消息至MQ失败，发送状态[" + sendStatus.name() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                    return QCUnifyReturnValue.Warn("发送状态[" + sendStatus.name() + "]");
                }
            } catch (Exception ex) {
                logger.error("sendForwardPointDataMessage 发送转发点号数据消息至MQ异常，异常信息[" + ex.getMessage() + "]，任务ID[" + message.getTaskid() + "]，分解项ID[" + message.getWbsid() + "]");
                return QCUnifyReturnValue.Warn("异常信息[" + ex.getMessage() + "]");
            }
        }

        return QCUnifyReturnValue.Success();
    }
}
